#include <printk.h>
#include <i386_lib32.h>
#include <pic_8259A.h>
#include <clock_8253.h>

/*****************************************************
 *      硬件中断控制器初始化
 *****************************************************/
void arch_int_init(void)
{
    /* ICW1:    1            1           001 
     *          衡为一         电平触发    写入 icw4
     */
    out_b(INT_M_CTL, 0x11);                 
    out_b(INT_S_CTL, 0x11);

    /* ICW2:  分配给 8259A 的中断向量起始中断号   */
    out_b(INT_M_CTLMSK, 0x20);              //0x20 ~ 0x27
    out_b(INT_S_CTLMSK, 0x28);              //0x28 ~ 0x2f

    /* ICW3:  定义级联芯片的中断号   */              //  0000    0100
    out_b(INT_M_CTLMSK, 0x04);              //从芯片在主芯片的引脚
    out_b(INT_S_CTLMSK, 0x02);              //从芯片连接到主芯片的中断号

    /*  ICW4    */
    out_b(INT_M_CTLMSK, 0x01);
    out_b(INT_S_CTLMSK, 0x01);

    //disable_irqs();
    enable_irqs();
}


/*   屏蔽所有中断 : 某位为1，则屏蔽某一个中断  */
void disable_irqs(void)
{
    out_b(INT_M_CTLMSK, 0xff);
    out_b(INT_S_CTLMSK, 0xff);
}

/*   打开所有中断   */
void enable_irqs(void)
{
    out_b(INT_M_CTLMSK, 0x10);
    out_b(INT_S_CTLMSK, 0x10);
}



/*****************************************************
 *      硬件时钟初始化
 *****************************************************/
void arch_clock_init(void)
{
    /*   00             11          010             0   */
    /*   计数器0                     脉冲模式             */
    out_b(IO_CLOCK_CTL, 0x34);
    out_b(IO_COUNTER0, TIMER_COUNT &  0x00ff);       //初值: CLOCK_8253_HZ/HZ
    out_b(IO_COUNTER0, TIMER_COUNT >> 8);
}